#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>
#include <iostream>
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

typedef websocketpp::client<websocketpp::config::asio_client> client;

// 定义消息处理器
void on_message(client *c, websocketpp::connection_hdl hdl, client::message_ptr msg)
{
    std::cout << "Received: " << msg->get_payload() << std::endl;
}

int main()
{
    client ws_client;

    // 初始化 ASIO
    ws_client.init_asio();

    // 设置消息处理器
    ws_client.set_message_handler(bind(&on_message, &ws_client, ::_1, ::_2));

    // 连接错误处理器
    ws_client.set_fail_handler([](websocketpp::connection_hdl hdl)
                               { std::cerr << "Connection failed!" << std::endl; });

    // 创建连接对象
    websocketpp::lib::error_code ec;
    auto conn = ws_client.get_connection("ws://localhost:9002", ec);
    if (ec)
    {
        std::cerr << "Connection error: " << ec.message() << std::endl;
        return 1;
    }

    // 连接服务器
    ws_client.connect(conn);

    // 启动异步事件循环
    std::thread t([&ws_client]()
                  { ws_client.run(); });

    // 发送消息
    std::string input;
    while (std::getline(std::cin, input))
    {
        if (input == "exit")
            break;

        // 发送输入的消息
        websocketpp::lib::error_code ec;
        ws_client.send(conn->get_handle(), input, websocketpp::frame::opcode::text, ec);
        if (ec)
        {
            std::cerr << "Send failed: " << ec.message() << std::endl;
        }
    }

    // 关闭连接
    ws_client.close(conn->get_handle(), websocketpp::close::status::normal, "");
    t.join();

    return 0;
}